/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Sablony;

import java.util.Calendar;
import java.util.Date;
import java.util.SortedSet;
import java.util.TreeSet;



/**
 *
 * @author MartinaHlinková
 */
public class Klient implements Comparable<Klient>{
    private int idKlienta;
    private String menoKlienta;
    private TreeSet<PritomnostKlientov> pritomnostKlienta;
    
    public Klient(int id, String meno){
        this.idKlienta = id;
        this.menoKlienta = meno;
        this.pritomnostKlienta = new TreeSet<PritomnostKlientov>();
    }
    
    public boolean pridajPritomnost(Date zaciatok, Date koniec, StavKlienta stav){
        if(zaciatok == null || koniec == null || stav == null) return false;
        Sablony.PritomnostKlientov novaPritomnost = new PritomnostKlientov(zaciatok, koniec, stav);
        if(novaPritomnost.skontrolujSpravnost() == false) return false;
        for(Sablony.PritomnostKlientov iterator: this.pritomnostKlienta){
            if(novaPritomnost.majuRovnakeIntervaly(iterator) == true){
                return false;
            }
        }
        return pritomnostKlienta.add(novaPritomnost);
    }
    
    public boolean pridajPritomnost(Sablony.PritomnostKlientov novaPritomnost){
        if(novaPritomnost == null || novaPritomnost.skontrolujSpravnost() == false) return false;
         for(Sablony.PritomnostKlientov iterator: this.pritomnostKlienta){
            if(novaPritomnost.majuRovnakeIntervaly(iterator) == true) return false;
        }
        return pritomnostKlienta.add(novaPritomnost);
    }
    
    public boolean odoberPritomnost(Sablony.PritomnostKlientov datum){
        if(datum == null)return false;
        return this.pritomnostKlienta.remove(datum);
    }
    
    public String[][] pritomnostiKlientaToArray(){
        int pocetRiadkov = this.pocetPritomnosti();
        if(pocetRiadkov <=0 ) return null;
        String[][] pritomnostiKlientaArray = new String[pocetRiadkov][3];
        int pocet = 0;
        for(Sablony.PritomnostKlientov iterator:this.pritomnostKlienta){
            pritomnostiKlientaArray[pocet] = iterator.pritomnostToArray();
        }
        return pritomnostiKlientaArray;
    }
    
    public int pocetPritomnosti(){
        return this.pritomnostKlienta.size();
    }
    
    public String getMenoKlienta(){
        return this.menoKlienta;
    }
    
    public int getIDKlienta(){
        return this.idKlienta;
    }
    
    public TreeSet<PritomnostKlientov> getPritomnostKlienta(){
        return this.pritomnostKlienta;
    }
    
    public Sablony.PritomnostKlientov najdiPritomnostPodlaPociatocnehoCasu(String pociatocnyCas){
        if(pociatocnyCas == null) return null;
        
        for(Sablony.PritomnostKlientov iterator:this.pritomnostKlienta){
            String hladanie = iterator.getPociatocnyCas().toString();
            if(hladanie.equals(pociatocnyCas)){
                return iterator;
            }
        }
        return null;
    }

    public boolean equals(Object o){
        if(o == this){
            return true;
        }
        if(o instanceof Klient == false){
            return false;
        }
        boolean rovnake = (this.idKlienta == ((Klient) o).idKlienta);
        return rovnake;
    }
    
    @Override
    public int hashCode(){
        return this.idKlienta;
    }
   
    @Override
    public int compareTo(Klient o) {
        if(this.idKlienta > o.idKlienta) return 1;
        if(this.idKlienta < o.idKlienta) return (-1);
        return 0;
    }
    
    public String[] klientToArray(){
        String[] klientArray = new String[2];
        klientArray[0] = Integer.toString(this.getIDKlienta());
        klientArray[1] = this.getMenoKlienta();
        return klientArray;
    }
    
    public Sablony.StavKlienta klientVCentre(Date datum){
        for(PritomnostKlientov iterator: this.pritomnostKlienta){
            if(iterator.casPatridoPritomnosti(datum)== true){
                return iterator.getStavKlienta();
            }
        }
        return null;
    }
    
    
    
    
    public String toString(){
        return "Klient " + this.getMenoKlienta()+" : "+ Integer.toString(this.getIDKlienta());
    }
    
    public static void main(String[] args){
        System.out.println("**********************************************");
        System.out.println("*Pokusny test s Klientom a jeho pritomnostami*");
        System.out.println("**********************************************");
        
        Klient pokus = new Klient(77, "Pokusny Klient");
        
        Date prvyZaciatok = new Date(113,1,20,8,30,0);
        Date prvyKoniec = new Date(113,1,23,8,0,0);
        Date druhyZaciatok = new Date(113,1,25,8,0,0);
        Date druhyKoniec = new Date(113,1,27,12,0,0);
        Date tretiZaciatok = new Date(113,2,1,18,0,0);
        Date tretiKoniec = new Date(113,2,7,8,0,0);
       
        
        pokus.pridajPritomnost(prvyZaciatok, prvyKoniec, StavKlienta.TAZKY);
        pokus.pridajPritomnost(druhyZaciatok, druhyKoniec, StavKlienta.TAZKY);
        pokus.pridajPritomnost(tretiZaciatok, tretiKoniec, StavKlienta.LAHKY);
        
        for(Sablony.PritomnostKlientov pritomnost: pokus.pritomnostKlienta){
            System.out.println(pritomnost);
        }
        
        Date nespravnyZaciatok = new Date(113,2,2,6,0,0);
        Date nespravnyKoniec = new Date(113,2,1,18,0,0);
        
        if(pokus.pridajPritomnost(nespravnyZaciatok, nespravnyKoniec, StavKlienta.TAZKY) == false){
            System.out.println("Spravne nepridatie pritomnosti - koniec pred zaciatkom");
        }else{
            System.out.println("chybne pridatie pritomnosti - koniec pred zaciatkom");
        }
        
        Date nespravnyZ2 = new Date(113,2,2,8,0,0);
        Date nespravnyK2 = new Date(113,2,3,8,0,0);
        
        if(pokus.pridajPritomnost(nespravnyZ2, nespravnyK2, StavKlienta.TAZKY) == false){
            System.out.println("Spravne nepridatie pritomnosti - interval uz je v pritomnostiach");
        }else{
            System.out.println("chybne pridatie pritomnosti - interval uz je v pritomnostiach");
        }
        //Date nespravneOdoberZac = new Date(113,1,1,1,1,1);
        //Date nespravneOdoberKon = new Date(113,2,2,2,2,2);
        Sablony.PritomnostKlientov nespravneOdober = new Sablony.PritomnostKlientov(prvyZaciatok, tretiKoniec, StavKlienta.TAZKY);
        Sablony.PritomnostKlientov spravneOdober = new Sablony.PritomnostKlientov(prvyZaciatok, prvyKoniec, StavKlienta.TAZKY);
        if(pokus.odoberPritomnost(nespravneOdober) == false){
            System.out.println("Spravne neodobranie pritomnosti.");
        }
        if(pokus.odoberPritomnost(spravneOdober) == true){
            System.out.println("Spravne odobranie pritomnosti.");
        }
        
        for(Sablony.PritomnostKlientov pritomnost: pokus.pritomnostKlienta){
            System.out.println(pritomnost);
        }
        
    }
}
